package _go

/*
203. 移除链表元素
难度
简单

566

收藏

分享
切换为英文
接收动态
反馈
给你一个链表的头节点 head 和一个整数 val ，请你删除链表中所有满足 Node.val == val 的节点，并返回 新的头节点 。


示例 1：


输入：head = [1,2,6,3,4,5,6], val = 6
输出：[1,2,3,4,5]
示例 2：

输入：head = [], val = 1
输出：[]
示例 3：

输入：head = [7,7,7,7], val = 7
输出：[]


提示：

列表中的节点在范围 [0, 104] 内
1 <= Node.val <= 50
0 <= k <= 50
通过次数147,182提交次数308,995
*/
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
/*
	核心思想是 哨兵  因为要删除节点 所以需要知道前置节点 方便删除
*/
func removeElements(head *ListNode, val int) *ListNode {
	if head == nil {
		return nil
	}
	//新的返回值
	res := &ListNode{0, head}
	pre := res   //定义哨兵
	curr := head //当前的节点
	for curr != nil {
		if curr.Val == val {
			pre.Next = pre.Next.Next //如果相等  哨兵的直接向后移动
		} else {
			pre = curr //不相等  哨兵变更为当前节点
		}
		curr = curr.Next //遍历下一个节点
	}
	return res.Next
}
